/*
 * Kuzzle, a backend software, self-hostable and ready to use
 * to power modern apps
 *
 * Copyright 2015-2022 Kuzzle
 * mailto: support AT kuzzle.io
 * website: http://kuzzle.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

export type GenerateRandomNameOpts = {
  /**
   * Optional prefix.
   */
  prefix?: string;

  /**
   * Optional separator. Defaults to `-`.
   */
  separator?: string;

  /**
   * Optional postfix random number range. Set to `false` to disable postfix. Defaults to `{ min: 0, max: 100000 }`
   */
  postfixRandRange?:
    | {
        /**
         * Optional minimum postfix random number (inclusive). Defaults to `0`.
         */
        min?: number;

        /**
         * Maximum postfix random number (exclusive).
         */
        max: number;
      }
    | false;
};

export class NameGenerator {
  /**
   * Returns a random name.
   *
   * # Usage:
   *
   * ```js
   * const name = NameGenerator.getRandomName(); // 'verdi'
   * ```
   *
   * @returns a random name
   */
  static getRandomName(): string {
    return names[randomNumber(names.length)];
  }

  /**
   * Returns a random adjective.
   *
   * # Usage
   *
   * ```js
   * const adj = NameGenerator.getRandomAdjective(); // 'absent'
   * ```
   *
   * @returns a random adjective
   */
  static getRandomAdjective(): string {
    return adjectives[randomNumber(adjectives.length)];
  }

  /**
   * Generates a random formatted name that consists of an optional prefix, a random adjective,
   * a random name and an optional random number separated by separator (default: '-').
   *
   * Format: `[prefix<separator>]<adjective><separator><name>[<separator>random number]`
   *
   * Format example: `something-dashing-euler-1164`
   *
   * ## Usage
   *
   * ```js
   * let name = NameGenerator.generateRandomName({
   *   prefix: 'my',
   *   separator: '_',
   *   postfixRandRange: { min: 1, max: 10 }
   * }); // 'my_abandoned_yogi_5'
   *
   * name = NameGenerator.generateRandomName({
   *   separator: ' ',
   *   postfixRandRange: false
   * }); // 'amused vampire'
   * ```
   *
   * @param {GenerateRandomNameOpts} opts Optional options
   *
   * @returns a random formatted name
   */
  static generateRandomName({
    prefix,
    separator = "-",
    postfixRandRange = { max: 100000, min: 0 },
  }: GenerateRandomNameOpts = {}): string {
    const adjective = NameGenerator.getRandomAdjective();
    const name = NameGenerator.getRandomName();

    prefix = prefix !== undefined ? `${prefix}${separator}` : "";

    if (postfixRandRange === false) {
      return `${prefix}${adjective}${separator}${name}`;
    }

    const { min = 0, max } = postfixRandRange;

    return `${prefix}${adjective}${separator}${name}${separator}${randomNumber(
      min,
      max,
    )}`;
  }
}

export function randomNumber(max: number): number;
export function randomNumber(min: number, max: number): number;
export function randomNumber(min: number, max?: number): number {
  if (max === undefined) {
    max = min;
    min = 0;
  }

  max = Math.floor(max);
  min = Math.floor(min);

  return Math.floor(Math.random() * (max - min)) + min;
}

const adjectives = [
  "aback",
  "abandoned",
  "abashed",
  "aberrant",
  "abiding",
  "ablaze",
  "able",
  "aboard",
  "abrasive",
  "abrupt",
  "absent",
  "absorbed",
  "abstracted",
  "absurd",
  "abundant",
  "acceptable",
  "accessible",
  "accidental",
  "accurate",
  "acidic",
  "acoustic",
  "acrid",
  "actually",
  "adamant",
  "adorable",
  "adventurous",
  "agitated",
  "alert",
  "aloof",
  "amiable",
  "amused",
  "annoyed",
  "antsy",
  "anxious",
  "appetizing",
  "apprehensive",
  "astonishing",
  "average",
  "bashful",
  "batty",
  "beautiful",
  "befitting",
  "beneficial",
  "bent",
  "berserk",
  "bewildered",
  "billowy",
  "biting",
  "bitter",
  "bizarre",
  "bland",
  "bloody",
  "blue",
  "blushing",
  "boiling",
  "bored",
  "boring",
  "bouncy",
  "boundless",
  "brainy",
  "brash",
  "brave",
  "brawny",
  "breakable",
  "breezy",
  "brief",
  "bright",
  "broad",
  "bulky",
  "bumpy",
  "burly",
  "bustling",
  "busy",
  "cagey",
  "calculating",
  "callous",
  "calm",
  "capable",
  "capricious",
  "careful",
  "careless",
  "caring",
  "cautious",
  "ceaseless",
  "certain",
  "changeable",
  "charming",
  "cheeky",
  "cheerful",
  "chemical",
  "chief",
  "chilly",
  "chivalrous",
  "chunky",
  "classy",
  "clean",
  "clever",
  "cloistered",
  "closed",
  "cloudy",
  "clumsy",
  "cluttered",
  "coherent",
  "cold",
  "colorful",
  "colossal",
  "combative",
  "comfortable",
  "common",
  "complete",
  "complex",
  "concerned",
  "confused",
  "conscious",
  "contemplative",
  "convincing",
  "convoluted",
  "cool",
  "cooperative",
  "coordinated",
  "corny",
  "costly",
  "courageous",
  "crabby",
  "crazy",
  "creepy",
  "crooked",
  "cuddly",
  "cultured",
  "cumbersome",
  "curious",
  "curly",
  "cut",
  "cynical",
  "daffy",
  "daily",
  "damp",
  "dangerous",
  "dapper",
  "dashing",
  "dazzling",
  "deafening",
  "dear",
  "debonair",
  "deceitful",
  "decisive",
  "decorous",
  "deep",
  "defiant",
  "delicate",
  "delicious",
  "delightful",
  "delirious",
  "demonic",
  "dependent",
  "depressed",
  "deranged",
  "descriptive",
  "deserted",
  "detailed",
  "determined",
  "devilish",
  "disgusted",
  "distinct",
  "distraught",
  "distressed",
  "disturbed",
  "dizzy",
  "drab",
  "drained",
  "dull",
  "eager",
  "early",
  "earsplitting",
  "earthy",
  "easy",
  "eatable",
  "economic",
  "ecstatic",
  "educated",
  "efficacious",
  "efficient",
  "eight",
  "elastic",
  "elated",
  "elderly",
  "electric",
  "elegant",
  "elfin",
  "elite",
  "emaciated",
  "embarrassed",
  "eminent",
  "empty",
  "enchanted",
  "enchanting",
  "encouraging",
  "endurable",
  "energetic",
  "enormous",
  "entertaining",
  "enthusiastic",
  "envious",
  "equable",
  "equal",
  "erratic",
  "ethereal",
  "exasperated",
  "excited",
  "exhilarated",
  "extensive",
  "exuberant",
  "fabulous",
  "faded",
  "faint",
  "fair",
  "faithful",
  "false",
  "familiar",
  "famous",
  "fancy",
  "fantastic",
  "far",
  "fascinated",
  "fast",
  "fearless",
  "feigned",
  "festive",
  "few",
  "fierce",
  "flat",
  "floppy",
  "fluttering",
  "foolish",
  "frantic",
  "fresh",
  "friendly",
  "frightened",
  "frothy",
  "frustrating",
  "funny",
  "fuzzy",
  "gabby",
  "gainful",
  "gamy",
  "gaping",
  "garrulous",
  "gaudy",
  "general",
  "gentle",
  "ghastly",
  "giant",
  "giddy",
  "gifted",
  "gigantic",
  "glamorous",
  "gleaming",
  "glib",
  "glistening",
  "glorious",
  "glossy",
  "godly",
  "good",
  "goofy",
  "gorgeous",
  "graceful",
  "grandiose",
  "grateful",
  "grieving",
  "gritty",
  "grubby",
  "grumpy",
  "habitual",
  "half",
  "hallowed",
  "halting",
  "handsome",
  "handy",
  "hanging",
  "hapless",
  "happy",
  "harmonious",
  "harsh",
  "hateful",
  "heady",
  "healthy",
  "heartbreaking",
  "heavenly",
  "heavy",
  "hellish",
  "helpful",
  "helpless",
  "hesitant",
  "hideous",
  "high",
  "hilarious",
  "hissing",
  "historical",
  "holistic",
  "hollow",
  "homeless",
  "homely",
  "honorable",
  "horrible",
  "horrific",
  "hospitable",
  "huge",
  "hulking",
  "humdrum",
  "humorous",
  "hungry",
  "hurried",
  "hurt",
  "hushed",
  "husky",
  "hypnotic",
  "icky",
  "icy",
  "ideal",
  "ill",
  "illegal",
  "illustrious",
  "imaginary",
  "immense",
  "imminent",
  "impartial",
  "important",
  "impossible",
  "incandescent",
  "incredible",
  "industrious",
  "infamous",
  "innate",
  "innocent",
  "inquisitive",
  "insidious",
  "instinctive",
  "intelligent",
  "interesting",
  "intrigued",
  "invincible",
  "irate",
  "irritable",
  "irritating",
  "itchy",
  "jaded",
  "jagged",
  "jazzy",
  "jealous",
  "jittery",
  "jolly",
  "joyous",
  "judicious",
  "jumbled",
  "jumpy",
  "kaput",
  "keen",
  "kind",
  "kindhearted",
  "kindly",
  "knotty",
  "knowing",
  "known",
  "labored",
  "lackadaisical",
  "lacking",
  "lame",
  "lamentable",
  "languid",
  "large",
  "last",
  "late",
  "lazy",
  "lean",
  "learned",
  "left",
  "legal",
  "lethal",
  "level",
  "light",
  "likeable",
  "limping",
  "literate",
  "little",
  "lively",
  "livid",
  "living",
  "lonely",
  "longing",
  "loose",
  "lopsided",
  "loud",
  "loutish",
  "lovely",
  "loving",
  "lucky",
  "ludicrous",
  "lumpy",
  "lush",
  "luxuriant",
  "lying",
  "lyrical",
  "macabre",
  "maddening",
  "madly",
  "magenta",
  "magical",
  "magnificent",
  "majestic",
  "makeshift",
  "malicious",
  "mammoth",
  "maniacal",
  "many",
  "marked",
  "marvelous",
  "massive",
  "material",
  "materialistic",
  "mean",
  "measly",
  "meaty",
  "medical",
  "melancholy",
  "mellow",
  "melodic",
  "melted",
  "merciful",
  "messy",
  "mighty",
  "military",
  "milky",
  "miniature",
  "mistaken",
  "misty",
  "mixed",
  "modern",
  "moldy",
  "momentous",
  "moody",
  "mortified",
  "motionless",
  "mountainous",
  "muddled",
  "muddy",
  "mundane",
  "murky",
  "mushy",
  "mute",
  "mysterious",
  "nappy",
  "narrow",
  "nasty",
  "natural",
  "nauseating",
  "neat",
  "nebulous",
  "necessary",
  "needy",
  "neighborly",
  "nervous",
  "new",
  "next",
  "nice",
  "nifty",
  "nimble",
  "nine",
  "nippy",
  "noiseless",
  "noisy",
  "nonchalant",
  "nonsensical",
  "nonstop",
  "normal",
  "nostalgic",
  "nosy",
  "noxious",
  "numberless",
  "numerous",
  "nutritious",
  "nutty",
  "obnoxious",
  "observant",
  "obtainable",
  "oceanic",
  "odd",
  "offbeat",
  "old",
  "omniscient",
  "one",
  "onerous",
  "open",
  "opposite",
  "optimal",
  "orange",
  "ordinary",
  "organic",
  "outgoing",
  "outrageous",
  "outstanding",
  "painful",
  "pale",
  "paltry",
  "panicky",
  "panoramic",
  "parallel",
  "parched",
  "parsimonious",
  "past",
  "pastoral",
  "peaceful",
  "penitent",
  "perfect",
  "periodic",
  "permissible",
  "perpetual",
  "precious",
  "prickly",
  "proud",
  "quack",
  "quaint",
  "quarrelsome",
  "quick",
  "quiet",
  "quirky",
  "quixotic",
  "quizzical",
  "rabid",
  "ragged",
  "rainy",
  "rambunctious",
  "rampant",
  "rapid",
  "rare",
  "raspy",
  "ratty",
  "ready",
  "real",
  "reassured",
  "rebel",
  "receptive",
  "recondite",
  "red",
  "redundant",
  "reflective",
  "regular",
  "relieved",
  "responsive",
  "robust",
  "rotund",
  "rough",
  "round",
  "sable",
  "sad",
  "safe",
  "salty",
  "same",
  "sarcastic",
  "sassy",
  "satisfying",
  "savory",
  "scant",
  "scarce",
  "scared",
  "scary",
  "scattered",
  "scientific",
  "scintillating",
  "scrawny",
  "screeching",
  "second",
  "shaggy",
  "shaky",
  "sharp",
  "shiny",
  "short",
  "silky",
  "silly",
  "skinny",
  "slimy",
  "slippery",
  "small",
  "smiling",
  "smoggy",
  "smooth",
  "smug",
  "soggy",
  "solid",
  "sour",
  "sparkling",
  "spicy",
  "splendid",
  "spotless",
  "square",
  "steady",
  "steep",
  "sticky",
  "stormy",
  "stout",
  "straight",
  "strange",
  "strong",
  "stunning",
  "substantial",
  "successful",
  "succulent",
  "superficial",
  "superior",
  "swanky",
  "sweet",
  "tacit",
  "tacky",
  "talented",
  "tall",
  "tangible",
  "tangy",
  "tart",
  "tasteful",
  "tasteless",
  "tasty",
  "tearful",
  "tedious",
  "teeny",
  "telling",
  "tender",
  "tense",
  "terrible",
  "testy",
  "thankful",
  "thoughtful",
  "timely",
  "tricky",
  "troubled",
  "twitterpated",
  "ubiquitous",
  "unaccountable",
  "unarmed",
  "unbiased",
  "uncovered",
  "understood",
  "uninterested",
  "unique",
  "unknown",
  "unusual",
  "upbeat",
  "uppity",
  "upset",
  "useful",
  "utopian",
  "uttermost",
  "vagabond",
  "vague",
  "valuable",
  "various",
  "vast",
  "vengeful",
  "venomous",
  "verdant",
  "versed",
  "vexed",
  "victorious",
  "vigorous",
  "violent",
  "violet",
  "virtuous",
  "vivacious",
  "vivid",
  "voiceless",
  "volatile",
  "voracious",
  "wacky",
  "waiting",
  "wakeful",
  "wandering",
  "warlike",
  "warm",
  "wary",
  "watery",
  "wealthy",
  "weary",
  "whimsical",
  "whispering",
  "whole",
  "whopping",
  "wicked",
  "wide",
  "wiggly",
  "wild",
  "willing",
  "windy",
  "wiry",
  "wise",
  "wistful",
  "witty",
  "wobbly",
  "woebegone",
  "wonderful",
  "worried",
  "wrathful",
  "wrong",
  "yellow",
  "yielding",
  "young",
  "youthful",
  "yummy",
  "zany",
  "zealous",
  "zippy",
];

const names = [
  "aardvark",
  "achilles",
  "acrobat",
  "actor",
  "aeolus",
  "aether",
  "albatross",
  "alligator",
  "ampere",
  "anansi",
  "anaxagoras",
  "anaximander",
  "andersen",
  "andromache",
  "andromeda",
  "ant",
  "anteater",
  "antelope",
  "antigone",
  "anthropologist",
  "aphrodite",
  "apollo",
  "arachne",
  "arborist",
  "archaeologist",
  "archimedes",
  "architect",
  "ares",
  "ariadne",
  "aristotle",
  "armadillo",
  "artemis",
  "artisan",
  "artist",
  "asclepius",
  "asimov",
  "astronaut",
  "atalanta",
  "athena",
  "attorney",
  "atwood",
  "author",
  "babbage",
  "bach",
  "badger",
  "bagheera",
  "baker",
  "balzac",
  "banjo",
  "barnacle",
  "bartender",
  "basilisk",
  "bat",
  "baudelaire",
  "bear",
  "beatboxer",
  "beauvoir",
  "beckett",
  "bee",
  "beethoven",
  "beetle",
  "bernouilli",
  "besant",
  "bigfoot",
  "bird",
  "bison",
  "blacksmith",
  "boar",
  "bogeyman",
  "bohr",
  "boltzmann",
  "boole",
  "boreas",
  "borges",
  "boudicca",
  "boxer",
  "brachiosaurus",
  "bradbury",
  "brahmagupta",
  "brahms",
  "bronte",
  "buffalo",
  "bug",
  "burgess",
  "butterfly",
  "calliope",
  "calvin",
  "camel",
  "camus",
  "canary",
  "cantor",
  "capybara",
  "caracal",
  "caravaggio",
  "caribou",
  "carnot",
  "carpenter",
  "carroll",
  "carson",
  "cartoonist",
  "cashier",
  "cassandra",
  "cassiopeia",
  "castor",
  "cat",
  "catfish",
  "centaur",
  "centipede",
  "cerberus",
  "cervantes",
  "cezanne",
  "chadwick",
  "chandrasekhar",
  "charpak",
  "cheetah",
  "chemist",
  "cherenkov",
  "chicken",
  "chimera",
  "chimpanzee",
  "chinchilla",
  "chipmunk",
  "chopin",
  "christie",
  "cinematographer",
  "circe",
  "clio",
  "cloud",
  "colorist",
  "comedian",
  "composer",
  "coriolis",
  "cornelius",
  "coulomb",
  "cow",
  "coyote",
  "crab",
  "critic",
  "crocodile",
  "cuckoo",
  "curator",
  "curie",
  "daedalus",
  "daffy",
  "dali",
  "dancer",
  "darwin",
  "davinci",
  "debussy",
  "deer",
  "defoe",
  "degas",
  "demeter",
  "democritus",
  "dentist",
  "descartes",
  "dickens",
  "dickinson",
  "diebold",
  "dijkstra",
  "dingo",
  "dinosaur",
  "dionysus",
  "dirac",
  "dog",
  "dolphin",
  "doppleganger",
  "doppler",
  "dostoevsky",
  "dove",
  "dragon",
  "dragonfly",
  "dramaturge",
  "droopy",
  "duck",
  "dumas",
  "dvorak",
  "eagle",
  "ebadi",
  "echidna",
  "eco",
  "economist",
  "eel",
  "ehrenfest",
  "einstein",
  "electrician",
  "elephant",
  "elk",
  "emerson",
  "empedocles",
  "endymion",
  "engineer",
  "eosphorus",
  "epicurus",
  "erato",
  "ernst",
  "essayist",
  "euclid",
  "euler",
  "euripides",
  "euterpe",
  "fairy",
  "falcon",
  "faraday",
  "faulkner",
  "fawcett",
  "fawkes",
  "feynman",
  "fibonacci",
  "filmmaker",
  "firebird",
  "fitzgerald",
  "flamingo",
  "flaubert",
  "flea",
  "foreman",
  "foucault",
  "fourier",
  "fox",
  "frank",
  "franklin",
  "fredon",
  "freelancer",
  "freeman",
  "frog",
  "fuller",
  "gaia",
  "galileo",
  "gamow",
  "gandalf",
  "gandhi",
  "ganymede",
  "garfield",
  "gauss",
  "gecko",
  "geographer",
  "geologist",
  "geralt",
  "gershwin",
  "ghost",
  "ghostwriter",
  "giraffe",
  "gnome",
  "goat",
  "goblin",
  "godzilla",
  "goethe",
  "goldfish",
  "golem",
  "goose",
  "gorgon",
  "gorilla",
  "greene",
  "greer",
  "griffin",
  "grizzly",
  "hades",
  "hamster",
  "hare",
  "hawk",
  "hawking",
  "haydn",
  "hedgehog",
  "hedwig",
  "heisenberg",
  "helios",
  "hemmingway",
  "hepburn",
  "hephaestus",
  "hera",
  "heraclitus",
  "hermes",
  "heron",
  "hertz",
  "hesperus",
  "hestia",
  "higgs",
  "hilbert",
  "hippopotamus",
  "historian",
  "hobbes",
  "holiday",
  "hooke",
  "hopper",
  "hornet",
  "horse",
  "hubble",
  "huffman",
  "hugo",
  "huxley",
  "huygens",
  "hydra",
  "hyena",
  "iago",
  "icarus",
  "iguana",
  "illusionist",
  "illustrator",
  "imp",
  "impala",
  "impressionist",
  "inventor",
  "jabberwocky",
  "jackal",
  "jaguar",
  "janitor",
  "jellyfish",
  "joule",
  "journalist",
  "joyce",
  "kafka",
  "kahlo",
  "kangaroo",
  "keats",
  "keller",
  "kelvin",
  "kepler",
  "kernighan",
  "kestrel",
  "kierkegaard",
  "kipling",
  "kite",
  "kitten",
  "kiwi",
  "klimt",
  "knuth",
  "koala",
  "koenig",
  "kolmogorov",
  "korn",
  "ladybird",
  "lagrange",
  "lake",
  "laplace",
  "lemming",
  "lemur",
  "leopard",
  "leprechaun",
  "leucothea",
  "lion",
  "lizard",
  "llama",
  "loroupe",
  "lovecraft",
  "lovelace",
  "lynx",
  "lyricist",
  "maathai",
  "magician",
  "magritte",
  "mahler",
  "majorana",
  "manatee",
  "manticore",
  "mantis",
  "marconi",
  "mathematician",
  "matisse",
  "maugrim",
  "maupassant",
  "maxwell",
  "mechanic",
  "medusa",
  "mermaid",
  "meerkat",
  "melpomene",
  "melville",
  "mice",
  "michelangelo",
  "mime",
  "miner",
  "minotaur",
  "minstrel",
  "mobydick",
  "mockingbird",
  "mole",
  "moliere",
  "monet",
  "mongoose",
  "monkey",
  "moth",
  "mozart",
  "munch",
  "murphy",
  "musician",
  "nabokov",
  "naturalist",
  "nereus",
  "nero",
  "neurologist",
  "newt",
  "newton",
  "nietzsche",
  "nightingale",
  "noether",
  "novelist",
  "nymph",
  "nyx",
  "oceanographer",
  "ocelot",
  "ogre",
  "ohm",
  "okapi",
  "opossum",
  "oppenheimer",
  "orangutan",
  "orpheus",
  "orwell",
  "osprey",
  "otter",
  "owl",
  "painter",
  "paleontologist",
  "panda",
  "pankhurst",
  "parks",
  "parrot",
  "peacock",
  "pegasus",
  "pelican",
  "penciller",
  "penelope",
  "penguin",
  "penrose",
  "performer",
  "peron",
  "persephone",
  "perseus",
  "phaenon",
  "phaethon",
  "pharmacist",
  "phoenix",
  "photographer",
  "photojournalist",
  "physicist",
  "picasso",
  "pigeon",
  "piranha",
  "pixie",
  "planck",
  "plato",
  "platypus",
  "playwright",
  "plucky",
  "plumber",
  "poe",
  "poet",
  "poincare",
  "pollock",
  "polyhymnia",
  "porcupine",
  "poseidon",
  "potamoi",
  "professor",
  "prokofiev",
  "proust",
  "psychiatrist",
  "psychologist",
  "pterodactyl",
  "puffin",
  "puma",
  "pushkin",
  "pyroeis",
  "pythagoras",
  "rabbit",
  "rachmaninov",
  "racoon",
  "radiologist",
  "raphael",
  "ratel",
  "rattlesnake",
  "ravel",
  "raven",
  "ray",
  "reeves",
  "rembrandt",
  "renoir",
  "reptile",
  "rhinoceros",
  "riemann",
  "rimbaud",
  "ringmaster",
  "ritchie",
  "roach",
  "roadrunner",
  "roddent",
  "rooster",
  "rubens",
  "rutherford",
  "saintexupery",
  "sakharov",
  "salinger",
  "salmon",
  "sanger",
  "sappho",
  "sartre",
  "sasquatch",
  "satie",
  "scenographer",
  "schrodinger",
  "schubert",
  "schumann",
  "schwarzschild",
  "scientist",
  "screenwriter",
  "scribe",
  "sculptor",
  "sea",
  "seahorse",
  "sealion",
  "selene",
  "serval",
  "seurat",
  "shadowfax",
  "shakespeare",
  "shannon",
  "shark",
  "sheep",
  "shelley",
  "shelob",
  "shostakovich",
  "showrunner",
  "sibelius",
  "sinatra",
  "singer",
  "siren",
  "skylark",
  "snake",
  "sociologist",
  "socrates",
  "soloist",
  "solzhenitsyn",
  "sophocles",
  "sparrow",
  "sphinx",
  "spider",
  "sprite",
  "squirrel",
  "stanton",
  "statistician",
  "steinbeck",
  "stendhal",
  "stevenson",
  "stilbon",
  "stoker",
  "strauss",
  "stravinsky",
  "stroustrup",
  "surgeon",
  "susskind",
  "swallow",
  "swamp",
  "swan",
  "sylph",
  "tapir",
  "tarantula",
  "taxidermist",
  "tchaikovsky",
  "termite",
  "terpsichore",
  "tesla",
  "tethys",
  "thales",
  "thalia",
  "thaumas",
  "theseus",
  "thomson",
  "thunderbird",
  "tiger",
  "toad",
  "tolkien",
  "tolstoy",
  "tortoise",
  "toucan",
  "triceratops",
  "triteia",
  "triton",
  "trout",
  "turing",
  "turtle",
  "twain",
  "tweety",
  "tyrannosaurus",
  "ungoliant",
  "unicorn",
  "uralia",
  "vampire",
  "vangogh",
  "vaughan",
  "velazquez",
  "velociraptor",
  "verdi",
  "vermeer",
  "verne",
  "virgil",
  "volta",
  "voltaire",
  "vulture",
  "wagner",
  "waiter",
  "waldo",
  "wallaby",
  "wanda",
  "warhol",
  "wasp",
  "weasel",
  "welder",
  "werewolf",
  "whale",
  "wilde",
  "wolf",
  "woodstock",
  "writer",
  "yeats",
  "yogi",
  "yousafzai",
  "zebra",
  "zephyrus",
  "zeus",
  "zola",
  "zoologist",
];
